/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mesaayuda.DAO;

import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import mesaayuda.DAO.exceptions.NonexistentEntityException;
import mesaayuda.DAO.exceptions.PreexistingEntityException;
import mesaayuda.model.Usuario;
import mesaayuda.model.Topicoayuda;
import mesaayuda.model.Causascerrarticket;
import mesaayuda.model.Ticket;

/**
 *
 * @author Juany
 */
public class TicketJpaController implements Serializable {

    public TicketJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Ticket ticket) throws PreexistingEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Usuario idUsuarioatiende = ticket.getIdUsuarioatiende();
            if (idUsuarioatiende != null) {
                idUsuarioatiende = em.getReference(idUsuarioatiende.getClass(), idUsuarioatiende.getIdUsuario());
                ticket.setIdUsuarioatiende(idUsuarioatiende);
            }
            Usuario idUsuariosolicitante = ticket.getIdUsuariosolicitante();
            if (idUsuariosolicitante != null) {
                idUsuariosolicitante = em.getReference(idUsuariosolicitante.getClass(), idUsuariosolicitante.getIdUsuario());
                ticket.setIdUsuariosolicitante(idUsuariosolicitante);
            }
            Topicoayuda idTopicoayuda = ticket.getIdTopicoayuda();
            if (idTopicoayuda != null) {
                idTopicoayuda = em.getReference(idTopicoayuda.getClass(), idTopicoayuda.getIdTopicoayuda());
                ticket.setIdTopicoayuda(idTopicoayuda);
            }
            Causascerrarticket idCausascerrarticket = ticket.getIdCausascerrarticket();
            if (idCausascerrarticket != null) {
                idCausascerrarticket = em.getReference(idCausascerrarticket.getClass(), idCausascerrarticket.getIdCausascerrarticket());
                ticket.setIdCausascerrarticket(idCausascerrarticket);
            }
            em.persist(ticket);
            if (idUsuarioatiende != null) {
                idUsuarioatiende.getTicketCollection().add(ticket);
                idUsuarioatiende = em.merge(idUsuarioatiende);
            }
            if (idUsuariosolicitante != null) {
                idUsuariosolicitante.getTicketCollection().add(ticket);
                idUsuariosolicitante = em.merge(idUsuariosolicitante);
            }
            if (idTopicoayuda != null) {
                idTopicoayuda.getTicketCollection().add(ticket);
                idTopicoayuda = em.merge(idTopicoayuda);
            }
            if (idCausascerrarticket != null) {
                idCausascerrarticket.getTicketCollection().add(ticket);
                idCausascerrarticket = em.merge(idCausascerrarticket);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findTicket(ticket.getIdTicket()) != null) {
                throw new PreexistingEntityException("Ticket " + ticket + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Ticket ticket) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Ticket persistentTicket = em.find(Ticket.class, ticket.getIdTicket());
            Usuario idUsuarioatiendeOld = persistentTicket.getIdUsuarioatiende();
            Usuario idUsuarioatiendeNew = ticket.getIdUsuarioatiende();
            Usuario idUsuariosolicitanteOld = persistentTicket.getIdUsuariosolicitante();
            Usuario idUsuariosolicitanteNew = ticket.getIdUsuariosolicitante();
            Topicoayuda idTopicoayudaOld = persistentTicket.getIdTopicoayuda();
            Topicoayuda idTopicoayudaNew = ticket.getIdTopicoayuda();
            Causascerrarticket idCausascerrarticketOld = persistentTicket.getIdCausascerrarticket();
            Causascerrarticket idCausascerrarticketNew = ticket.getIdCausascerrarticket();
            if (idUsuarioatiendeNew != null) {
                idUsuarioatiendeNew = em.getReference(idUsuarioatiendeNew.getClass(), idUsuarioatiendeNew.getIdUsuario());
                ticket.setIdUsuarioatiende(idUsuarioatiendeNew);
            }
            if (idUsuariosolicitanteNew != null) {
                idUsuariosolicitanteNew = em.getReference(idUsuariosolicitanteNew.getClass(), idUsuariosolicitanteNew.getIdUsuario());
                ticket.setIdUsuariosolicitante(idUsuariosolicitanteNew);
            }
            if (idTopicoayudaNew != null) {
                idTopicoayudaNew = em.getReference(idTopicoayudaNew.getClass(), idTopicoayudaNew.getIdTopicoayuda());
                ticket.setIdTopicoayuda(idTopicoayudaNew);
            }
            if (idCausascerrarticketNew != null) {
                idCausascerrarticketNew = em.getReference(idCausascerrarticketNew.getClass(), idCausascerrarticketNew.getIdCausascerrarticket());
                ticket.setIdCausascerrarticket(idCausascerrarticketNew);
            }
            ticket = em.merge(ticket);
            if (idUsuarioatiendeOld != null && !idUsuarioatiendeOld.equals(idUsuarioatiendeNew)) {
                idUsuarioatiendeOld.getTicketCollection().remove(ticket);
                idUsuarioatiendeOld = em.merge(idUsuarioatiendeOld);
            }
            if (idUsuarioatiendeNew != null && !idUsuarioatiendeNew.equals(idUsuarioatiendeOld)) {
                idUsuarioatiendeNew.getTicketCollection().add(ticket);
                idUsuarioatiendeNew = em.merge(idUsuarioatiendeNew);
            }
            if (idUsuariosolicitanteOld != null && !idUsuariosolicitanteOld.equals(idUsuariosolicitanteNew)) {
                idUsuariosolicitanteOld.getTicketCollection().remove(ticket);
                idUsuariosolicitanteOld = em.merge(idUsuariosolicitanteOld);
            }
            if (idUsuariosolicitanteNew != null && !idUsuariosolicitanteNew.equals(idUsuariosolicitanteOld)) {
                idUsuariosolicitanteNew.getTicketCollection().add(ticket);
                idUsuariosolicitanteNew = em.merge(idUsuariosolicitanteNew);
            }
            if (idTopicoayudaOld != null && !idTopicoayudaOld.equals(idTopicoayudaNew)) {
                idTopicoayudaOld.getTicketCollection().remove(ticket);
                idTopicoayudaOld = em.merge(idTopicoayudaOld);
            }
            if (idTopicoayudaNew != null && !idTopicoayudaNew.equals(idTopicoayudaOld)) {
                idTopicoayudaNew.getTicketCollection().add(ticket);
                idTopicoayudaNew = em.merge(idTopicoayudaNew);
            }
            if (idCausascerrarticketOld != null && !idCausascerrarticketOld.equals(idCausascerrarticketNew)) {
                idCausascerrarticketOld.getTicketCollection().remove(ticket);
                idCausascerrarticketOld = em.merge(idCausascerrarticketOld);
            }
            if (idCausascerrarticketNew != null && !idCausascerrarticketNew.equals(idCausascerrarticketOld)) {
                idCausascerrarticketNew.getTicketCollection().add(ticket);
                idCausascerrarticketNew = em.merge(idCausascerrarticketNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = ticket.getIdTicket();
                if (findTicket(id) == null) {
                    throw new NonexistentEntityException("The ticket with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Ticket ticket;
            try {
                ticket = em.getReference(Ticket.class, id);
                ticket.getIdTicket();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The ticket with id " + id + " no longer exists.", enfe);
            }
            Usuario idUsuarioatiende = ticket.getIdUsuarioatiende();
            if (idUsuarioatiende != null) {
                idUsuarioatiende.getTicketCollection().remove(ticket);
                idUsuarioatiende = em.merge(idUsuarioatiende);
            }
            Usuario idUsuariosolicitante = ticket.getIdUsuariosolicitante();
            if (idUsuariosolicitante != null) {
                idUsuariosolicitante.getTicketCollection().remove(ticket);
                idUsuariosolicitante = em.merge(idUsuariosolicitante);
            }
            Topicoayuda idTopicoayuda = ticket.getIdTopicoayuda();
            if (idTopicoayuda != null) {
                idTopicoayuda.getTicketCollection().remove(ticket);
                idTopicoayuda = em.merge(idTopicoayuda);
            }
            Causascerrarticket idCausascerrarticket = ticket.getIdCausascerrarticket();
            if (idCausascerrarticket != null) {
                idCausascerrarticket.getTicketCollection().remove(ticket);
                idCausascerrarticket = em.merge(idCausascerrarticket);
            }
            em.remove(ticket);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Ticket> findTicketEntities() {
        return findTicketEntities(true, -1, -1);
    }

    public List<Ticket> findTicketEntities(int maxResults, int firstResult) {
        return findTicketEntities(false, maxResults, firstResult);
    }

    private List<Ticket> findTicketEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Ticket.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Ticket findTicket(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Ticket.class, id);
        } finally {
            em.close();
        }
    }

    public int getTicketCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Ticket> rt = cq.from(Ticket.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
